理解崩溃转储


当 NW.js 崩溃时,将在磁盘上生成一个 minidump 文件 (.dmp)。用户可以将其包含在错误报告中。您可以解码 minidump 文件以获取崩溃时的堆栈跟踪。因此,在某些情况下,找出 NW.js 出现的问题很有帮助。

要从 minidump 文件中提取堆栈跟踪,您需要三样东西:从崩溃中生成的 minidump (.dmp) 文件、NW.js 二进制文件的符号文件以及 minidump_stackwalk 工具。

查找 Minidump 文件

当 NW.js 崩溃时,minidump 文件将在以下默认目录中生成

  • Linux: ~/.config/<name-in-manifest>/Crash\ Reports/
  • Windows: %LOCALAPPDATA%\<name-in-manifest>\User Data\CrashPad (在版本 < 0.21.5 中,它位于 %LOCALAPPDATA%\Chromium\User Data\CrashPad 中,因为存在 bug #5248 )
  • Mac: ~/Library/Application\ Support/<name-in-manifest>/CrashPad/

<name-in-manifest>清单文件 中的 name 字段。

从 Linux Minidump 文件中剥离头文件

在 Linux 上生成的 Minidump 文件包含额外的文本格式头文件。在解码之前必须剥离这些头文件。Minidump 文件的实际内容以 MDMP 开头,后面跟着不可读的二进制文件。因此,只需删除 MDMP 之前的文本即可。

组织符号文件

发布的 NW.js 的符号文件包可以从 https://dl.nwjs.io/ 下载。

例如,在 Mac 上,使用 0.57.1

https://dl.nwjs.io/v0.57.1/nwjs-symbol-v0.57.1-osx-x64.zip

https://dl.nwjs.io/v0.57.1/nwjs-sdk-symbol-v0.57.1-osx-x64.zip

然后,您必须以 **正确的路径和正确的文件名** 组织符号文件,以便 minidump_stackwalk 工具可以使用它们。minidump_stackwalk 使用 简单符号提供程序 来查找符号文件。以下是它查找符号文件的方式。

该工具将尝试按照以下模式搜索 .sym 文件(对于 Mac,将 .breakpad 更改为 .sym):
{SYMBOLS_ROOT}/{DEBUG_FILE_NAME}/{DEBUG_IDENTIFIER}/{DEBUG_FILE_NAME_WITHOUT_PDB}.sym

  • {SYMBOLS_ROOT} 是所有符号文件的根文件夹。您可以将所有版本的 NW .sym 文件放在同一个文件夹中。
  • {DEBUG_FILE_NAME}{DEBUG_IDENTIFIER}{DEBUG_FILE_NAME_WITHOUT_PDB} 可以从 .sym 文件的第一行获得,该行通常类似于 MODULE Linux x86_64 265BDB6BE043D5C70D3A1E279A8F0B1A0 nw(对于 Mac,类似于 MODULE mac x86_64 4E7C70708AFD3C889F02B149AB5007080 nwjs)。
    • 265BDB6BE043D5C70D3A1E279A8F0B1A0{DEBUG_IDENTIFIER}
    • nw{DEBUG_FILE_NAME}
    • {DEBUG_FILE_NAME_WITHOUT_PDB} 可以通过从 {DEBUG_FILE_NAME} 中删除 .pdb 扩展名来转换,该扩展名仅对 Windows 而言是必需的。

例如,在 Mac 上,使用 0.57.1

-symbols_root/
 -nwjs/
    -4E7C70708AFD3C889F02B149AB5007080/
        -nwjs.sym
 -nwjs Framework/
    -87A9EA49BC473F4C8B7817631E820BEB0/
        -nwjs Framework.sym
 -nwjs Helper/
    -5598EA295F4F36FDA21CB9A5B11B11AA0/
        -nwjs Helper.sym

使用 minidump_stackwalk 解码 Minidump

minidump_stackwalk 可以使用 NW.js 构建,也可以直接从 breakpad 源代码在 Mac 和 Linux 上构建。或者,您也可以从 Windows 上的 Cygwin 安装预构建版本。

要从 minidump 文件中获取堆栈跟踪,请运行以下命令:

minidump_stackwalk minidump_file.dmp /path/to/symbols_root 2>&1

如果符号文件没有正确组织,您仍然可以从该工具中获取调用堆栈。但是您将看不到符号,并且在输出的最后一部分(“已加载模块”)中会显示警告,例如:

0x00240000 - 0x02b29fff nw.exe ??? (main) (WARNING: No symbols, nw.exe.pdb, 669008F7B6EE44058CBD5F21BEB5B5CFe)

触发崩溃以进行测试

为了测试崩溃转储功能,您可以使用 NW.js 提供的 API 故意触发崩溃:App.crashBrowser()App.crashRenderer()。它们分别会使浏览器进程和渲染器进程崩溃。

参考资料